import { autoUpdater } from 'electron-updater'
import { app, dialog, BrowserWindow } from 'electron'
import log from 'electron-log'

// 配置日志
log.transports.file.level = 'info'
autoUpdater.logger = log

class AppUpdater {
  constructor() {
    this.mainWindow = null
    this.updateDownloaded = false
    this.retryCount = 0
    this.maxRetries = 3
    this.retryDelay = 5000
    this.setupAutoUpdater()
  }

  setMainWindow(window) {
    this.mainWindow = window
  }

  setupAutoUpdater() {
    // 配置更新服务器
    if (process.env.NODE_ENV === 'development') {
      autoUpdater.updateConfigPath = 'dev-app-update.yml'
    }

    // 设置自动下载
    autoUpdater.autoDownload = false
    autoUpdater.autoInstallOnAppQuit = true

    // 检查更新事件
    autoUpdater.on('checking-for-update', () => {
      log.info('正在检查更新...')
      this.sendToRenderer('update-checking')
    })

    // 发现可用更新
    autoUpdater.on('update-available', info => {
      log.info('发现可用更新:', info)
      this.sendToRenderer('update-available', info)
      this.showUpdateDialog(info)
    })

    // 没有可用更新
    autoUpdater.on('update-not-available', info => {
      log.info('当前已是最新版本:', info)
      this.sendToRenderer('update-not-available', info)
    })

    // 更新下载进度
    autoUpdater.on('download-progress', progressObj => {
      const message = `下载进度: ${Math.round(progressObj.percent)}%`
      log.info(message)
      this.sendToRenderer('download-progress', progressObj)
    })

    // 更新下载完成
    autoUpdater.on('update-downloaded', info => {
      log.info('更新下载完成:', info)
      this.updateDownloaded = true
      this.sendToRenderer('update-downloaded', info)
      this.showInstallDialog()
    })

    // 更新错误
    autoUpdater.on('error', error => {
      log.error('更新错误:', error)
      this.sendToRenderer('update-error', error.message)
      this.handleUpdateError(error)
    })
  }

  // 检查更新
  checkForUpdates() {
    if (process.env.NODE_ENV === 'development') {
      log.info('开发环境，跳过自动更新检查')
      return
    }

    this.checkForUpdatesWithRetry()
  }

  // 带重试机制的更新检查
  async checkForUpdatesWithRetry() {
    try {
      await autoUpdater.checkForUpdatesAndNotify()
      this.retryCount = 0 // 重置重试计数
    } catch (error) {
      log.error(`更新检查失败 (尝试 ${this.retryCount + 1}/${this.maxRetries}):`, error)

      if (this.retryCount < this.maxRetries) {
        this.retryCount++
        setTimeout(() => {
          this.checkForUpdatesWithRetry()
        }, this.retryDelay)
      } else {
        this.sendToRenderer('update-error', '网络连接失败，请检查网络设置后重试')
        this.retryCount = 0
      }
    }
  }

  // 手动检查更新
  checkForUpdatesManually() {
    this.retryCount = 0
    autoUpdater.checkForUpdates()
  }

  // 下载更新
  downloadUpdate() {
    try {
      autoUpdater.downloadUpdate()
    } catch (error) {
      log.error('下载更新失败:', error)
      this.sendToRenderer('update-error', '下载失败，请重试')
    }
  }

  // 安装更新
  installUpdate() {
    if (this.updateDownloaded) {
      try {
        autoUpdater.quitAndInstall()
      } catch (error) {
        log.error('安装更新失败:', error)
        this.sendToRenderer('update-error', '安装失败，请手动重启应用')
      }
    }
  }

  // 发送消息到渲染进程
  sendToRenderer(channel, data = null) {
    if (this.mainWindow && !this.mainWindow.isDestroyed()) {
      this.mainWindow.webContents.send('updater-message', {
        type: channel,
        data: data
      })
    }
  }

  // 显示更新对话框
  showUpdateDialog(info) {
    const options = {
      type: 'info',
      title: '发现新版本',
      message: `发现新版本 ${info.version}，是否立即下载？`,
      detail: info.releaseNotes || '本次更新包含功能改进和错误修复。',
      buttons: ['立即下载', '稍后提醒', '跳过此版本'],
      defaultId: 0,
      cancelId: 1
    }

    if (this.mainWindow && !this.mainWindow.isDestroyed()) {
      dialog
        .showMessageBox(this.mainWindow, options)
        .then(result => {
          if (result.response === 0) {
            this.downloadUpdate()
          } else if (result.response === 2) {
            // 跳过此版本的逻辑
            this.sendToRenderer('update-skipped', info.version)
          }
        })
        .catch(error => {
          log.error('显示更新对话框失败:', error)
        })
    }
  }

  // 显示安装对话框
  showInstallDialog() {
    const options = {
      type: 'info',
      title: '更新已下载',
      message: '更新已下载完成，是否立即重启应用进行安装？',
      buttons: ['立即重启', '稍后重启'],
      defaultId: 0,
      cancelId: 1
    }

    if (this.mainWindow && !this.mainWindow.isDestroyed()) {
      dialog
        .showMessageBox(this.mainWindow, options)
        .then(result => {
          if (result.response === 0) {
            this.installUpdate()
          }
        })
        .catch(error => {
          log.error('显示安装对话框失败:', error)
        })
    }
  }

  // 处理更新错误
  handleUpdateError(error) {
    let errorMessage = '更新过程中发生未知错误'

    if (error.message.includes('net::')) {
      errorMessage = '网络连接失败，请检查网络设置'
    } else if (error.message.includes('ENOTFOUND')) {
      errorMessage = '无法连接到更新服务器'
    } else if (error.message.includes('timeout')) {
      errorMessage = '连接超时，请稍后重试'
    } else if (error.message.includes('EACCES')) {
      errorMessage = '权限不足，请以管理员身份运行'
    }

    const options = {
      type: 'error',
      title: '更新失败',
      message: '检查更新时发生错误',
      detail: errorMessage,
      buttons: ['确定', '重试']
    }

    if (this.mainWindow && !this.mainWindow.isDestroyed()) {
      dialog
        .showMessageBox(this.mainWindow, options)
        .then(result => {
          if (result.response === 1) {
            // 重试
            setTimeout(() => {
              this.checkForUpdatesManually()
            }, 1000)
          }
        })
        .catch(dialogError => {
          log.error('显示错误对话框失败:', dialogError)
        })
    }
  }

  // 清理资源
  cleanup() {
    if (autoUpdater) {
      autoUpdater.removeAllListeners()
    }
  }
}

export default new AppUpdater()
